C++11版本发行已经几年了,许多老项目也切换到C++11版本,而在实际开发中,很多程序员由于不熟悉C++11版本的匿名函数 Lambda表达式 ,也依旧产生着大量冗余,杂乱的代码。
在以前,针对排序的比较函数,我们只能写一个cmp函数。
bool cmp(int a,int b) { return a < b; } void test_sort(vector<int>& vec) { sort(vec.begin(), vec.end(), cmp); printf("after sort cmp:\n"); for(int i=0;i<10;i++) { printf("%d: %d\n", i, vec[i]); } }
然而这个cmp函数只能在这个场景里使用,并且由于旧语法的限制,只能够定义一个全局函数,当需要多个cmp函数时,就显得异常凌乱。
在C++11版本中,C++引入了匿名函数Lambda 表达式。
语法如下:
[capture list] (parameter list) ->return type { function body }
其中第一个方括号代表闭包的特性,用来给匿名函数传递一些外部的变量。
大概分几类:
1、[] 不使用任何外部变量 2、[&] 所有变量都以引用形式使用 3、[=] 所有变量都以传值形式使用 4、[x, &y] x 以传值形式使用,y 以引用形式使用。 5、[&, x] x 以传值形式使用,其他的以引用形式使用。 6、[=, &z] z 以引用形式使用,其他的以传值形式使用。 7、[=, x, &y] 可以传入更多的参数
这样,我们就可以愉快的写匿名函数了。
sort(vec.begin(), vec.end(), [](int a, int b) -> bool { return a > b; }) printf("after sort lambda:\n"); for(int i=0;i<10;i++) { printf("%d: %d\n", i, vec[i]); }
在现实生产中,我们经常会遇到协程,这里就用协程来举例。
我们知道协程的每个并发都需要按照框架实现一个之类,而且还需要实现一个虚函数,这个虚函数内还可以进行相关的网络操作。这样进行封装后,就可以实现并发的对外请求了。
代码如下:
class RealCoroutine : public BaseCoroutine { public: int Process() { return netCoroutine();//业务的网络操作在这里进行 } } void test_task() { vector<BaseCoroutine> list; RealCoroutine* onr = new RealCoroutine(); //对one的初始化 list.push_back(one); RealCoroutine* two = new RealCoroutine(); //对one的初始化 list.push_back(two); exe_coroutine_list(list); //处理one的返回结果 //处理two的返回结果 }
如上所示,由于是并发操作,请求分为两部分来处理,而并发逻辑一多时,整个代码就会非常的凌乱,难以维护。
而此时使用 lambda 函数封装,则简洁的多。
class LambdaCoroutineList { public: void operator +=(const TaskFunc& f) { //... } int exe() { exe_coroutine_list(list); } private: vector<BaseCoroutine> list; }; void test_lambda() { LambdaCoroutineList list; list += []() { //对one的初始化 netCoroutine(); //处理one的返回结果 }; list += []() { //对two的初始化 netCoroutine(); //处理two的返回结果 } list.exe(); }
这时候,只需要在一个匿名函数里面以同步的方式写整个代码逻辑即可。
本页共116段,2326个字符,3708 Byte(字节)